package and.roid.mushi;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;

public class BoxGamen {
	// ゲーム状態
	private static final int GAME_START = 0;
	private static final int GAME_PLAY = 1;
	private static final int GAME_END = 2;
	private static final int GAME_CLEAR = 3;
	private int gamestate = 0;
	private boolean endflg = false;// ゲームオーバーフラグ
	private boolean claflg = false;// クリアフラグ
	private static final double PIE = 3.1415926;
	private int gamen_x, gamen_y, gamen_w, gamen_h;// 画面の大きさ取得用
	private List<BoxOb> listBugs = new ArrayList<BoxOb>();
	private Bitmap[] imgs = new Bitmap[4];
	private int score = 0;// スコア用
	private int kazu;// 虫の数用

	BoxGamen(int x, int y, int w, int h, Bitmap img, int state) {
		gamestate = state;
		gamen_x = x;
		gamen_y = y;
		gamen_w = w;
		gamen_h = h;
		// 一旦ここで画像を４つに分ける
		for (int i = 0; i < imgs.length; i++) {
			imgs[i] = Bitmap.createBitmap(img, i * (img.getWidth() / 4), 0,
					img.getWidth() / 4, img.getHeight());
		}
	}

	// 初期化
	public void init(float w, Bitmap img) {
		// ここから虫の初期位置決め
		Random r = new Random(new Date().getTime());
		kazu = r.nextInt(20) + 5;// 虫の数決め
		// kazu分だけ虫を作成
		for (int i = 0; i < kazu; i++) {
			r = new Random(new Date().getTime());
			int d = 90;// 虫移動方向
			int wh = 50;// 虫大きさ
			int vxy = r.nextInt(10) + 5;// 補正虫移動量用
			double rad = toRadian((d + 360) % 360);// 虫移動角度をラジアンに変換
			int xspeed = (int) (Math.cos(rad) * vxy);// 移動了確定
			int yspeed = (int) -(Math.sin(rad) * vxy);// 移動量確定
			int x = r.nextInt((gamen_w - wh) - wh) + wh;// 初期虫x座標
			int y = gamen_h;// 初期虫y座標
			int count = r.nextInt(100);// 虫出発用カウント
			// 虫作成
			listBugs.add(new BoxOb(count, x, y, wh, rad, vxy, xspeed, yspeed,
					imgs));
		}
	}

	// 表示
	public void draw(Canvas c, Paint p, String massage) {
		switch (gamestate) {
		case GAME_START:
			p.setTextSize(30);
			p.setColor(Color.GREEN);
			c.drawText(massage, gamen_x / 2, gamen_h / 2, p);
			break;
		case GAME_PLAY:
			p.setStyle(Paint.Style.STROKE);
			p.setColor(Color.BLACK);
			c.drawRect(new Rect(gamen_x, gamen_y, gamen_w, gamen_h), p);
			/*
			 * for (int i = 0; i < listBugs.size(); i++) {
			 * listBugs.get(i).draw(c, p); listBugs.get(i).setAnime();
			 * listBugs.get(i).move(); if (listBugs.get(i).getEnd() == true)
			 * endflg = true; if (listBugs.get(i).getDead() > 20) ++score; if
			 * (listBugs.get(i).getDead() > 20 || endflg == true) Reset(i); if
			 * (score == kazu) claflg = true; }
			 */
			synchronized (listBugs) {
				for (BoxOb bug : listBugs) {
					bug.draw(c, p);
					bug.setAnime();
					bug.move();
					if (bug.getEnd()) {
						endflg = true;
					}
					if (bug.getDead() > 20) {
						++score;
					}
					if (bug.getDead() > 20 || endflg) {
//						Reset(bug);
					}
					if (score == kazu) {
						claflg = true;
					}
				}
			}
			break;
		case GAME_END:
			p.setTextSize(30);
			p.setColor(Color.RED);
			c.drawText(massage, gamen_x, gamen_h / 2, p);
			break;
		case GAME_CLEAR:
			p.setTextSize(30);
			p.setColor(Color.RED);
			c.drawText(massage, gamen_x, gamen_h / 2, p);
			break;
		}

		p.setTextSize(30);
		p.setColor(Color.BLACK);
		c.drawText("SCORE:" + score, 10, 30, p);

	}

	// 虫消去用
	public void Reset(BoxOb bug) {
		synchronized (listBugs) {
			listBugs.remove(bug);
		}
	}

	// タッチ座標と虫座標を比べて潰したか否か
	public void RectRect(int x, int y) {
		synchronized (listBugs) {
			for(BoxOb bug : listBugs){
				// 虫を潰したか？
				if(bug.isSmash(x, y)){
					// 潰したらスピードを0にする
					bug.setDeadSpeed();
				}
			}
		}
	}

	// ラジアン変換
	public double toRadian(double deg) {
		return (deg * PIE / 180);
	}

	// ゲーム状態セット用
	public void setGameState(int state) {
		gamestate = state;
	}

	// ゲームオーバー確認用
	public boolean getEnd() {
		return endflg;
	}

	// ゲームクリア確認用
	public boolean getCla() {
		return claflg;
	}

	// ゲームオーバー確定用
	public void setEnd() {
		endflg = false;
	}

	// ゲームクリア確定用
	public void setCla() {
		claflg = false;
	}
}